--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
vendor/lxmfy/lxmfy/storage.py dev (c9f60cc5) Text, 17.51 KB
T8b949e"""Storage module for LXMFy bot framework.
This module provides abstract and concrete storage implementations for persistent data storage.
It includes a base StorageBackend interface and a JSON file-based implementation.
The Storage class serves as a facade for the underlying storage backend.
"""
Tff7b72import T7ee787base64
Tff7b72import T7ee787json
Tff7b72import T7ee787logging
Tff7b72import T7ee787sqlite3
Tff7b72from T7ee787abc Tff7b72import Te6edf3ABCTb4b4b4, Te6edf3abstractmethod
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any
Tff7b72import T7ee787RNS
Tff7b72from T7ee787LXMF Tff7b72import Te6edf3LXMessage
Tff7b72from T7ee787.T7ee787attachments Tff7b72import Te6edf3AttachmentTb4b4b4, Te6edf3AttachmentType
Tff7b72def Td2a8ffserialize_valueTb4b4b4(Te6edf3objTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Serialize complex objects to JSON-compatible format.
Args:
obj: The object to serialize.
Returns:
A JSON-compatible representation of the object.
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3objTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4}
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Te6edf3datetimeTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffdatetimeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4: Te6edf3objTff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4)Tb4b4b4}
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Te6edf3LXMessageTb4b4b4)Tb4b4b4:
Te6edf3msg_data Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffLXMessageTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3objTff7b72.Td2a8ffsource_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Te6edf3objTff7b72.Td2a8ffdestination_hashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3objTff7b72.Td2a8ffcontentTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3objTff7b72.Td2a8ffcontent Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3objTff7b72.Td2a8fftitleTb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Tb4b4b4(
Te6edf3objTff7b72.Td2a8fftimestampTff7b72.Td2a8ffisoformatTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTff7b72.Td2a8fftimestampTb4b4b4, Te6edf3datetimeTb4b4b4)
Tff7b72else Tffa657strTb4b4b4(Te6edf3objTff7b72.Td2a8fftimestampTb4b4b4)
Tff7b72if Te6edf3objTff7b72.Td2a8fftimestamp Tff7b72is Tff7b72not Tff7b72None
Tff7b72else Tff7b72None
Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3objTb4b4b4, Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4) Tff7b72and Te6edf3objTff7b72.Td2a8fffieldsTb4b4b4:
Te6edf3msg_dataTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4] Tff7b72= Tb4b4b4{
Tffa657strTb4b4b4(Te6edf3kTb4b4b4)Tb4b4b4: Te6edf3serialize_valueTb4b4b4(Te6edf3vTb4b4b4) Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3objTff7b72.Td2a8fffieldsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3msg_data
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Te6edf3AttachmentTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffAttachmentTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3objTff7b72.Td2a8fftypeTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3objTff7b72.Td2a8ffnameTb4b4b4,
Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64encodeTb4b4b4(Te6edf3objTff7b72.Td2a8ffdataTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4: Te6edf3objTff7b72.Td2a8ffformatTb4b4b4,
Tb4b4b4}
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tb4b4b4(Tffa657listTb4b4b4, Tffa657tupleTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3serialize_valueTb4b4b4(Te6edf3itemTb4b4b4) Tff7b72for Te6edf3item Tff7b72in Te6edf3objTb4b4b4]
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3serialize_valueTb4b4b4(Te6edf3vTb4b4b4) Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3objTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4}
Tff7b72return Te6edf3obj
Tff7b72def Td2a8ffdeserialize_valueTb4b4b4(Te6edf3objTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Deserialize from storage format.
Args:
obj: The object to deserialize.
Returns:
The deserialized object.
"""
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ff__typeTa5d6ff" Tff7b72in Te6edf3objTb4b4b4:
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffbytesTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3base64Tff7b72.Td2a8ffb64decodeTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffdatetimeTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3datetimeTff7b72.Td2a8fffromisoformatTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffLXMessageTa5d6ff"Tb4b4b4:
Te6edf3msg_data Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4: Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffsource_hashTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4: Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4: Te6edf3base64Tff7b72.Td2a8ffb64decodeTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4]
Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4: Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6fftitleTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Te6edf3datetimeTff7b72.Td2a8fffromisoformatTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]
Tff7b72else Tff7b72NoneTb4b4b4,
Tb4b4b4}
Tff7b72if Ta5d6ff"Ta5d6fffieldsTa5d6ff" Tff7b72in Te6edf3objTb4b4b4:
Te6edf3msg_dataTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3deserialize_valueTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6fffieldsTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3msg_data
Tff7b72if Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ff__typeTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffAttachmentTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3AttachmentTb4b4b4(
Tffa657typeTff7b72=Te6edf3AttachmentTypeTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Te6edf3nameTff7b72=Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3dataTff7b72=Te6edf3base64Tff7b72.Td2a8ffb64decodeTb4b4b4(Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tffa657formatTff7b72=Te6edf3objTb4b4b4[Ta5d6ff"Ta5d6ffformatTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4{Te6edf3kTb4b4b4: Te6edf3deserialize_valueTb4b4b4(Te6edf3vTb4b4b4) Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3objTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4}
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3deserialize_valueTb4b4b4(Te6edf3itemTb4b4b4) Tff7b72for Te6edf3item Tff7b72in Te6edf3objTb4b4b4]
Tff7b72return Te6edf3obj
Tff7b72class T56d364StorageBackendTb4b4b4(Te6edf3ABCTb4b4b4)Tb4b4b4:
T8b949e"""Abstract base class for storage backends."""
Tf0883e@abstractmethod
Tff7b72def Td2a8ffgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Retrieve a value from storage.
Args:
key: The key to retrieve.
default: The default value to return if the key is not found.
Returns:
The value associated with the key, or the default value if not found.
"""
Tf0883e@abstractmethod
Tff7b72def Td2a8ffsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Store a value in storage.
Args:
key: The key to store the value under.
value: The value to store.
"""
Tf0883e@abstractmethod
Tff7b72def Td2a8ffdeleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Delete a value from storage.
Args:
key: The key to delete.
"""
Tf0883e@abstractmethod
Tff7b72def Td2a8ffexistsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if a key exists in storage.
Args:
key: The key to check.
Returns:
True if the key exists, False otherwise.
"""
Tf0883e@abstractmethod
Tff7b72def Td2a8ffscanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Scan for keys with a given prefix.
Args:
prefix: The prefix to scan for.
Returns:
A list of keys that start with the prefix.
"""
Tff7b72class T56d364JSONStorageTb4b4b4(Te6edf3StorageBackendTb4b4b4)Tb4b4b4:
T8b949e"""JSON file-based storage backend."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3directoryTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Initialize a new JSONStorage instance.
Args:
directory: The directory to store the JSON files in.
"""
Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72= Te6edf3PathTb4b4b4(Te6edf3directoryTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72def Td2a8ffgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Retrieve a value from storage.
Args:
key: The key to retrieve.
default: The default value to return if the key is not found.
Returns:
The value associated with the key, or the default value if not found.
"""
Tff7b72if Te6edf3key Tff7b72in Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4]
Te6edf3file_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72/ Ta5d6fffTa5d6ff"Tffd700{Te6edf3keyTffd700}Ta5d6ff.jsonTa5d6ff"
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3file_pathTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadTb4b4b4(Te6edf3fTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3data
Tff7b72return Te6edf3data
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError reading Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3default
Tff7b72def Td2a8ffsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Store a value in storage.
Args:
key: The key to store the value under.
value: The value to store.
"""
Te6edf3file_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72/ Ta5d6fffTa5d6ff"Tffd700{Te6edf3keyTffd700}Ta5d6ff.jsonTa5d6ff"
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3jsonTff7b72.Td2a8ffdumpTb4b4b4(Te6edf3valueTb4b4b4, Te6edf3fTb4b4b4, Te6edf3indentTff7b72=T79c0ff2Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError writing Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffdeleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Delete a value from storage.
Args:
key: The key to delete.
"""
Te6edf3file_path Tff7b72= Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72/ Ta5d6fffTa5d6ff"Tffd700{Te6edf3keyTffd700}Ta5d6ff.jsonTa5d6ff"
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3file_pathTff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3file_pathTff7b72.Td2a8ffunlinkTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTff7b72.Td2a8ffpopTb4b4b4(Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError deleting Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffexistsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if a key exists in storage.
Args:
key: The key to check.
Returns:
True if the key exists, False otherwise.
"""
Tff7b72return Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffdirectory Tff7b72/ Ta5d6fffTa5d6ff"Tffd700{Te6edf3keyTffd700}Ta5d6ff.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffscanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Scan for keys with a given prefix.
Args:
prefix: The prefix to scan for.
Returns:
A list of keys that start with the prefix.
"""
Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3file Tff7b72in Tff7b72selfTff7b72.Td2a8ffdirectoryTff7b72.Td2a8ffglobTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3prefixTffd700}Ta5d6ff*.jsonTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3key Tff7b72= Te6edf3fileTff7b72.Td2a8ffstem
Tff7b72if Te6edf3keyTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3prefixTb4b4b4)Tb4b4b4:
Te6edf3resultsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError scanning with prefix Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3prefixTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3results
Tff7b72class T56d364SQLiteStorageTb4b4b4(Te6edf3StorageBackendTb4b4b4)Tb4b4b4:
T8b949e"""SQLite database storage backend."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3database_pathTb4b4b4: Tffa657strTb4b4b4)Tb4b4b4:
T8b949e"""Initialize a new SQLiteStorage instance.
Args:
database_path: The path to the SQLite database file.
"""
Tff7b72selfTff7b72.Td2a8ffdatabase_path Tff7b72= Te6edf3database_path
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_ensure_db_dirTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_init_dbTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_ensure_db_dirTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Ensure the database directory exists."""
Te6edf3db_path Tff7b72= Te6edf3PathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4)
Te6edf3db_dir Tff7b72= Te6edf3db_pathTff7b72.Td2a8ffparent
Tff7b72tryTb4b4b4:
Te6edf3db_dirTff7b72.Td2a8ffmkdirTb4b4b4(Te6edf3parentsTff7b72=Tff7b72TrueTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6ff"Ta5d6ffFailed to create database directory Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4,
Te6edf3db_dirTb4b4b4,
Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ff_init_dbTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Initialize the database table."""
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"""
Ta5d6ff CREATE TABLE IF NOT EXISTS key_value (
Ta5d6ff key TEXT PRIMARY KEY,
Ta5d6ff value TEXT,
Ta5d6ff type TEXT,
Ta5d6ff created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
Ta5d6ff updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Ta5d6ff )
Ta5d6ff Ta5d6ff"""Tb4b4b4)
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"""
Ta5d6ff CREATE INDEX IF NOT EXISTS idx_key_prefix ON key_value(key)
Ta5d6ff Ta5d6ff"""Tb4b4b4)
Tff7b72except Te6edf3sqlite3Tff7b72.Td2a8ffOperationalError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(
Ta5d6ff"Ta5d6ffFailed to initialize database at Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4,
Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72raise
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffUnexpected error initializing database: Tffd700%sTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Retrieve a value from storage.
Args:
key: The key to retrieve.
default: The default value to return if the key is not found.
Returns:
The value associated with the key, or the default value if not found.
"""
Tff7b72if Te6edf3key Tff7b72in Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4]
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3cursor Tff7b72= Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT value FROM key_value WHERE key = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Te6edf3keyTb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3row Tff7b72= Te6edf3cursorTff7b72.Td2a8fffetchoneTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3rowTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3value Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3rowTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72return Te6edf3value
Tff7b72except Te6edf3jsonTff7b72.Td2a8ffJSONDecodeErrorTb4b4b4:
Tff7b72return Te6edf3rowTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError reading Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3default
Tff7b72def Td2a8ffsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Store a value in storage.
Args:
key: The key to store the value under.
value: The value to store.
"""
Tff7b72tryTb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3valueTb4b4b4, Tb4b4b4(Tffa657dictTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3serialized Tff7b72= Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3serialized Tff7b72= Tffa657strTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(
T8b949e"""
INSERT OR REPLACE INTO key_value (key, value, type, updated_at)
VALUES (?, ?, ?, CURRENT_TIMESTAMP)
"""Tb4b4b4,
Tb4b4b4(Te6edf3keyTb4b4b4, Te6edf3serializedTb4b4b4, Tffa657typeTb4b4b4(Te6edf3valueTb4b4b4)Tff7b72.Td2a8ff__name__Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError writing Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffdeleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Delete a value from storage.
Args:
key: The key to delete.
"""
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffDELETE FROM key_value WHERE key = ?Ta5d6ff"Tb4b4b4, Tb4b4b4(Te6edf3keyTb4b4b4,Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcacheTff7b72.Td2a8ffpopTb4b4b4(Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError deleting Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72raise
Tff7b72def Td2a8ffexistsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if a key exists in storage.
Args:
key: The key to check.
Returns:
True if the key exists, False otherwise.
"""
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3cursor Tff7b72= Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(Ta5d6ff"Ta5d6ffSELECT 1 FROM key_value WHERE key = ?Ta5d6ff"Tb4b4b4, Tb4b4b4(Te6edf3keyTb4b4b4,Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3cursorTff7b72.Td2a8fffetchoneTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72not Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError checking existence of Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3keyTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffscanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Scan for keys with a given prefix.
Args:
prefix: The prefix to scan for.
Returns:
A list of keys that start with the prefix.
"""
Tff7b72tryTb4b4b4:
Tff7b72with Te6edf3sqlite3Tff7b72.Td2a8ffconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdatabase_pathTb4b4b4) Tff7b72as Te6edf3connTb4b4b4:
Te6edf3cursor Tff7b72= Te6edf3connTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT key FROM key_value WHERE key LIKE ? ORDER BY keyTa5d6ff"Tb4b4b4,
Tb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3prefixTffd700}Ta5d6ff%Ta5d6ff"Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72return Tb4b4b4[Te6edf3rowTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72for Te6edf3row Tff7b72in Te6edf3cursorTff7b72.Td2a8fffetchallTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffloggerTff7b72.Td2a8fferrorTb4b4b4(Ta5d6ff"Ta5d6ffError scanning with prefix Tffd700%sTa5d6ff: Tffd700%sTa5d6ff"Tb4b4b4, Te6edf3prefixTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4[Tb4b4b4]
Tff7b72class T56d364MemoryStorageTb4b4b4(Te6edf3StorageBackendTb4b4b4)Tb4b4b4:
T8b949e"""In-memory storage backend."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Initialize a new MemoryStorage instance."""
Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fflogger Tff7b72= Te6edf3loggingTff7b72.Td2a8ffgetLoggerTb4b4b4(Tff7b72__name__Tb4b4b4)
Tff7b72def Td2a8ffgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Retrieve a value from storage."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffgetTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3defaultTb4b4b4)
Tff7b72def Td2a8ffsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Store a value in storage."""
Tff7b72selfTff7b72.Td2a8ffdataTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3value
Tff7b72def Td2a8ffdeleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Delete a value from storage."""
Tff7b72selfTff7b72.Td2a8ffdataTff7b72.Td2a8ffpopTb4b4b4(Te6edf3keyTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72def Td2a8ffexistsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if a key exists in storage."""
Tff7b72return Te6edf3key Tff7b72in Tff7b72selfTff7b72.Td2a8ffdata
Tff7b72def Td2a8ffscanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Scan for keys with a given prefix."""
Tff7b72return Tb4b4b4[Te6edf3k Tff7b72for Te6edf3k Tff7b72in Tff7b72selfTff7b72.Td2a8ffdata Tff7b72if Te6edf3kTff7b72.Td2a8ffstartswithTb4b4b4(Te6edf3prefixTb4b4b4)Tb4b4b4]
Tff7b72class T56d364StorageTb4b4b4:
T8b949e"""Facade for the underlying storage backend."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3backendTb4b4b4: Te6edf3StorageBackendTb4b4b4)Tb4b4b4:
T8b949e"""Initialize a new Storage instance.
Args:
backend: The storage backend to use.
"""
Tff7b72selfTff7b72.Td2a8ffbackend Tff7b72= Te6edf3backend
Tff7b72def Td2a8ffgetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3defaultTb4b4b4: Te6edf3Any Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Te6edf3AnyTb4b4b4:
T8b949e"""Retrieve a value from storage.
Args:
key: The key to retrieve.
default: The default value to return if the key is not found.
Returns:
The value associated with the key, or the default value if not found.
"""
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffgetTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3defaultTb4b4b4)
Tff7b72return Te6edf3deserialize_valueTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72def Td2a8ffsetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4, Te6edf3valueTb4b4b4: Te6edf3AnyTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Store a value in storage.
Args:
key: The key to store the value under.
value: The value to store.
"""
Te6edf3serialized Tff7b72= Te6edf3serialize_valueTb4b4b4(Te6edf3valueTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffsetTb4b4b4(Te6edf3keyTb4b4b4, Te6edf3serializedTb4b4b4)
Tff7b72def Td2a8ffdeleteTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tff7b72NoneTb4b4b4:
T8b949e"""Delete a value from storage.
Args:
key: The key to delete.
"""
Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffdeleteTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72def Td2a8ffexistsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
T8b949e"""Check if a key exists in storage.
Args:
key: The key to check.
Returns:
True if the key exists, False otherwise.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3keyTb4b4b4)
Tff7b72def Td2a8ffscanTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3prefixTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4:
T8b949e"""Scan for keys with a given prefix.
Args:
prefix: The prefix to scan for.
Returns:
A list of keys that start with the prefix.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffbackendTff7b72.Td2a8ffscanTb4b4b4(Te6edf3prefixTb4b4b4)
Tff7b72def Td2a8ffget_role_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3role_nameTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4:
T8b949e"""Helper method for permission system.
Args:
role_name: The name of the role.
Returns:
The role data.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffgetTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffroles:Tffd700{Te6edf3role_nameTffd700}Ta5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72def Td2a8ffset_role_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3role_nameTb4b4b4: Tffa657strTb4b4b4, Te6edf3dataTb4b4b4: Tffa657dictTb4b4b4)Tb4b4b4:
T8b949e"""Helper method for permission system.
Args:
role_name: The name of the role.
data: The role data.
"""
Tff7b72selfTff7b72.Td2a8ffsetTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffroles:Tffd700{Te6edf3role_nameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3dataTb4b4b4)
Tff7b72def Td2a8ffget_user_rolesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3user_hashTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4:
T8b949e"""Helper method for permission system.
Args:
user_hash: The hash of the user.
Returns:
The list of roles for the user.
"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ffgetTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffuser_roles:Tffd700{Te6edf3user_hashTffd700}Ta5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72def Td2a8ffset_user_rolesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3user_hashTb4b4b4: Tffa657strTb4b4b4, Te6edf3rolesTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4]Tb4b4b4)Tb4b4b4:
T8b949e"""Helper method for permission system.
Args:
user_hash: The hash of the user.
roles: The list of roles for the user.
"""
Tff7b72selfTff7b72.Td2a8ffsetTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffuser_roles:Tffd700{Te6edf3user_hashTffd700}Ta5d6ff"Tb4b4b4, Te6edf3rolesTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────